#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <sys/wait.h>

int main()
{
    signal(SIGCHLD, SIG_IGN);//手动设置对SIGCHLD进行忽略即可
    pid_t id = fork();
    if(id == 0)
    {
        int cnt = 5;
        while(cnt)
        {
            std::cout << "child process running" << std::endl;
            cnt--;
            sleep(1);
        }
        exit(1);
    }
    while(true)
    {
        std::cout << "father running" << std::endl;
        sleep(1);
    }

    return 0;
}














// void notice(int signo)
// {
//     std::cout << "get a signal: " << signo << " pid: " << getpid() << std::endl;
//     while (true)
//     {
//         pid_t rid = waitpid(-1, nullptr, WNOHANG);//非阻塞方式等待
//         if (rid > 0)
//         {
//             std::cout << "wait child success,rid: " << rid << std::endl;
//         }
//         else if (rid < 0)
//         {
//             std::cout << "wait child success done" << std::endl;
//             break;
//         }
//         else // rid == 0 还有部分子进程未退，所以不用回收了，退出即可
//         {
//             std::cout << "wait child success done" << std::endl;
//             break;
//         }
//     }
// }

// void DoOtherThing()
// {
//     std::cout << "DoOtherThing" << std::endl;
// }

// int main()
// {
//     signal(SIGCHLD, notice);
//     for (int i = 0; i < 10; i++)
//     {
//         pid_t id = fork();
//         if (id == 0)
//         {
//             // child
//             std::cout << "I am child process,pid: " << getpid() << std::endl;
//             sleep(3);
//             exit(1);
//         }
//     }
//     // father
//     while (true)
//     {
//         DoOtherThing();
//         sleep(1);
//     }

//     return 0;
// }

// volatile int gflag = 0;

// void changedata(int signo)
// {
//     std::cout << "get a signo:" << signo << ",change flag 0->1" << std::endl;
//     gflag = 1;
// }

// int main()
// {
//     signal(2, changedata);

//     while(!gflag);
//     std::cout << "process quit normal" << std::endl;

//     return 0;
// }

// void Print(sigset_t pending)
// {
//     for(int i = 31 ; i > 0 ; i--)
//     {
//         if(sigismember(&pending, i))
//             std::cout << 1 ;
//         else
//             std::cout << 0 ;
//     }
//     std::cout << std::endl;
// }

// void handler(int signum)
// {
//     std::cout << "get a sig: " << signum << std::endl;
//     while(true)
//     {
//         sigset_t pending;
//         sigpending(&pending);

//         Print(pending);
//         sleep(1);
//     }
//     exit(1);
// }
// int main()
// {
//     struct sigaction act,oact;
//     act.sa_handler = handler;
//     sigemptyset((&act.sa_mask));
//     sigaddset(&act.sa_mask,3);//对sa_mask指定添加3号信号
//     act.sa_flags = 0;

//     for(int i = 0 ; i <= 31 ; i++)
//         sigaction(i, &act, &oact);

//     while(true)
//     {
//         std::cout << "I am a process , pid: " << getpid() << std::endl;
//         sleep(1);
//     }
//     return 0;
// }